<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			//对象字面量{}		简单粗暴 、毫无复用性
			var obj = {
				name : 'bgg'	
			}
			obj.name = 'BGG';
			obj.sex = 'man';
			
			//工厂模式		简单直接、但是不清楚对象是哪个对象(构造器)生成的，因为没有用new。(不能针对性地添加方法到具体哪个原型对象上)
			function factory (name,sex) {
				var obj = new Object();
				obj.name = name;
				obj.sex = sex;
				return obj;
			}
			var ez = factory('ez','lady');
			var gh = factory('gh','lady');
			
			console.log(ez);
			console.log(gh);
			
			
			
			
			//构造函数模式
			//没有return 用new实例化对象
			//属性是个function时，调用同一个方法
			//弊端sayName不是专属的方法
			//差异性
			function Cat (name) {
				this.name = name;
				this.say = sayName;
			}
			function sayName() {
				console.log(this.name);
				console.log(this);
			}	
			var white = new Cat('白猫');
			var black = new Cat('黑猫');
			
//			
//			var say = function () {
//				
//			};
//			
//			say = function (){
//				
//			};

//			这里是两个方法
			
			console.log( white, black );
			
			
			
			
			
			//原型模式		yellow.__prototype__ === Dog.prototype
			//共通性
			function Dog(name){
				Dog.prototype.name = name;
				Dog.prototype.say = function () {
					console.log('汪汪');
				}
			}
			
			var yellow = new Dog('黄狗');
			console.log(yellow);	
			var tu = new Dog('土狗');
			console.log(tu);
			
			
			
			//混合模式(构造+原型)
			//构造函数的独立的属性
			//原型模式的共通性
			
			function Pig (name,) {
				this.name = name;
				Pig.prototype.say = function (){
					console.log('威猛先生');
				}
			}
			
			var pdd = new Pig('PDD');
			var lm = new Pig('刘某');
			console.log(pdd,lm);
			
			//this 	如果用new出来的对象使用this,this指的是实例化后的对象
		</script>
	</body>
</html>
